<html>
 <head>
  <meta charset="UTF-8">
 </head>
 <body>
  <h1 data-lake-id="WvD3M" id="WvD3M"><span data-lake-id="u881eb527" id="u881eb527">典型回答</span></h1>
  <p data-lake-id="uc185413d" id="uc185413d"><br></p>
  <p data-lake-id="u0eddba25" id="u0eddba25"><span data-lake-id="uf74d42e8" id="uf74d42e8">Redis中，事务和Lua都是保证原子性的手段，当我们有多个命令要执行，希望他们以原子性方式执行的时候，就会考虑使用事务或者Lua脚本，那么他们之间有哪些区别呢？（看了很多资料，包括redis官网文档，几乎都没有提，以下内容是我基于自己的理解整理的，欢迎大家补偿）</span></p>
  <p data-lake-id="u25e4bae9" id="u25e4bae9"><strong><span data-lake-id="u1d00972f" id="u1d00972f">​</span></strong><br></p>
  <h3 data-lake-id="EjFFK" id="EjFFK"><span data-lake-id="u344ebbda" id="u344ebbda">原子性保证</span></h3>
  <p data-lake-id="u093587fa" id="u093587fa"><strong><span data-lake-id="uef8ad1b5" id="uef8ad1b5">​</span></strong><br></p>
  <p data-lake-id="uee946bb1" id="uee946bb1"><span data-lake-id="ue251456f" id="ue251456f">事务和Lua都是可以保证原子性操作的，但是，这里说的原子性我们提过很多次，指的是不可拆分，不可中断的原子性操作。所以，需要注意的是，不管是Redis的事务还是Lua，都没办法回滚，一旦执行过程中有命令失败了，都是不支持回滚的。</span></p>
  <p data-lake-id="u2a1a5702" id="u2a1a5702"><span data-lake-id="udd21310d" id="udd21310d">​</span><br></p>
  <p data-lake-id="u7a50cf8d" id="u7a50cf8d"><strong><span data-lake-id="u92d78fea" id="u92d78fea">但是，Redis的事务在执行过程中，如果有某一个命令失败了，是不影响后续命令的执行的，而Lua脚本中，如果执行过程中某个命令执行失败了，是会影响后续命令执行的。</span></strong></p>
  <p data-lake-id="u763de7f0" id="u763de7f0"><strong><span data-lake-id="u5de48a29" id="u5de48a29">​</span></strong><br></p>
  <h3 data-lake-id="uk0wH" id="uk0wH"><span data-lake-id="u32379e70" id="u32379e70">交互次数</span></h3>
  <p data-lake-id="uc8fc5beb" id="uc8fc5beb"><br></p>
  <p data-lake-id="u9e6c8911" id="u9e6c8911"><span data-lake-id="u7adfa3ef" id="u7adfa3ef">在Redis的事务执行时，每一条命令都需要和Redis服务器进行一次交互，我们可以在Redis事务过程中，MULTI 和 EXEC 之间发送多个 Redis 命令给到Redis服务器，这些命令会被服务器缓存起来，但并不会立即执行。但是每一条命令的提交都需要进行一次网络交互。</span></p>
  <p data-lake-id="u6c52916f" id="u6c52916f"><span data-lake-id="u6c0a64e0" id="u6c0a64e0">​</span><br></p>
  <p data-lake-id="u59e475b9" id="u59e475b9"><span data-lake-id="u191fec53" id="u191fec53">而Lua脚本则不需要，只需要一次性的把整个脚本提交给Redis即可。网络交互比事务要少。</span></p>
  <p data-lake-id="u9f0c07d4" id="u9f0c07d4"><br></p>
  <h3 data-lake-id="U0JkD" id="U0JkD"><span data-lake-id="ub7fa6e4c" id="ub7fa6e4c">前后依赖</span></h3>
  <p data-lake-id="uace30210" id="uace30210"><br></p>
  <p data-lake-id="ua58048b1" id="ua58048b1"><span data-lake-id="uc07ef32f" id="uc07ef32f">在 Redis 的事务中，事务内的命令都是独立执行的，并且在没有执行EXEC命令之前，命令是没有被真正执行的，所以后续命令是不会也不能依赖于前一个命令的结果的。</span></p>
  <p data-lake-id="u80ec30b3" id="u80ec30b3"><br></p>
  <p data-lake-id="u7f4b04d3" id="u7f4b04d3"><span data-lake-id="u54e29e32" id="u54e29e32">而在Lua 脚本中是可以依赖前一个命令的结果的，Lua 脚本中的多个命令是依次执行的，我们可以利用前一个命令的结果进行后续的处理。</span></p>
  <p data-lake-id="u8bcf164e" id="u8bcf164e"><br></p>
  <h3 data-lake-id="FJanC" id="FJanC"><span data-lake-id="ub855f437" id="ub855f437">流程编排</span></h3>
  <p data-lake-id="u8fadd7f8" id="u8fadd7f8"><br></p>
  <p data-lake-id="ucbf06a86" id="ucbf06a86"><span data-lake-id="u62f2bc24" id="u62f2bc24">借助Lua脚本，我们可以实现非常丰富的各种分支流程控制，以及各种运算相关操作。而Redis的事务本身是不支持这些操作的。</span></p>
 </body>
</html>